package com.star.percalservice.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtTokenUtils {

    private static final String SECRET_KEY = "dafad656afd165aa3adwa65af1aalkhfjqorh198241hkfhalkhajkhf89aor1l2khkjfhnalokjr2109oqfjlLHDKjdnLHALJKFH3AAA907092313LKdafad656afd165aa3adwa65af1aalkhfjqorh198241hkfhalkhajkhf89aor1l2khkjfhnalokjr2109oqfjlDGVILHDKjdnLHALJKFH3AAA907092313LKadadqawdqda6da464646d4a"; // 密钥，可根据实际情况修改
    private static final long EXPIRATION_TIME = 86400000; // 过期时间，单位：毫秒，这里设置为 24 小时

    /**
     * 生成 Token
     * @param uid 手机号
     * @return Token
     */
    public static String generateToken(Integer uid) {
        Map<String, Object> claims = new HashMap<>();
        return Jwts.builder()
               .setClaims(claims)
               .setSubject(String.valueOf(uid))
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
               .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
               .compact();
    }

    /**
     * 解析 Token
     * @param token Token
     * @return 解析后的 Claims
     */
    public static Claims parseToken(String token) {
        return Jwts.parser()
               .setSigningKey(SECRET_KEY)
                .setAllowedClockSkewSeconds(300) // 允许 5 分钟时钟偏移
               .parseClaimsJws(token)
               .getBody();
    }

    /**
     * 验证 Token 是否有效
     * @param token Token
     * @return 是否有效
     */
    public static boolean validateToken(String token) {
        try {
            parseToken(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 判断 Token 是否过期 过期返回 true
     * @param token
     * @return
     */
    public static boolean isTokenExpired(String token) {
        Claims claims = parseToken(token);
        Date expiration = claims.getExpiration();
        return expiration.before(new Date());
    }

    /**
     * 从 Token 中获取用户ID
     * @param token Token
     * @return 用户名
     */
    public static String getUidFromToken(String token) {
        Claims claims = parseToken(token);
        return claims.getSubject();
    }
}